﻿using Microsoft.Practices.Unity;
using System;
using System.Collections.Generic;
using System.Web.Http.Dependencies;

namespace SelfHosting
{
    /// <summary>
    /// Classe pour la plage de dépendances.
    /// </summary>
    public class UnityDependencyScope : IDependencyScope
    {
        #region Constructeur

        /// <summary>
        /// Initialise une nouvelle instance de la classe UnityDependencyScope
        /// </summary>
        /// <param name="container">UnityContainer</param>
        public UnityDependencyScope(IUnityContainer container)
        {
            Container = container;
        }

        #endregion

        #region Propriétés

        /// <summary>
        /// Obtient le conteneur Unity
        /// </summary>
        protected IUnityContainer Container { get; private set; }

        #endregion

        #region Méthodes

        /// <summary>
        /// Récupère un service à partir de la portée
        /// </summary>
        /// <param name="serviceType">Le service à récupérer</param>
        /// <returns>Service récupéré</returns>
        public object GetService(Type serviceType)
        {
            if (Container.IsRegistered(serviceType))
            {
                return Container.Resolve(serviceType);
            }
            return null;
        }

        /// <summary>
        /// Récupère une collection de services à partir de la portée
        /// </summary>
        /// <param name="serviceType">Collection de services à récupérer</param>
        /// <returns>Collection de services récupérés</returns>
        public IEnumerable<object> GetServices(Type serviceType)
        {
            if (Container.IsRegistered(serviceType))
            {
                return Container.ResolveAll(serviceType);
            }
            return new List<object>();
        }

        /// <summary>
        /// Libération des ressources
        /// </summary>
        public void Dispose()
        {
            Container.Dispose();
        }

        #endregion
    }
}
